PnsxDump — модуль выгрузки структуры сети из Топоматик Robur
============================================================

Назначение
----------
Открывает активную модель сети (.pnsx) внутри Robur и выгружает её полную
структуру в текстовый файл:
  - узлы (колодцы): Id, имя, координаты X/Y, тип, описание;
  - линии/трубы: диаметры (внешний/внутренний/номинальный), материал,
    длины плана и профиля, станции начала/конца, уклон, отметки лотка и верха;
  - футляры участка ("Конструкция - Футляры"): "Тип конструкции", станции, длина.

Результат:  <эта папка>\rezult\pnsx_network_dump.txt

Установка
---------
Запустить install.cmd от имени администратора (UAC). Он сам найдёт Robur,
пересоберёт модуль под его сборки и скопирует PnsxDump.dll + PnsxDump.plugin
в каталог программы.

Удаление
--------
Запустить uninstall.cmd от имени администратора (UAC), предварительно
закрыв Robur. Он удалит PnsxDump.dll и PnsxDump.plugin — меню "PNSX"
исчезнет после перезапуска Robur.

Использование
-------------
1. Запустить Топоматик Robur, открыть проект с сетью.
2. Меню "PNSX" -> "Выгрузить структуру сети (PNSX)".
3. Появится окно "номер раздела" — ввести номер и нажать ОК.
4. Модуль заполнит файл dano\данные_с_плана.xls (начиная со строки 5)
   по "справка по заполнению dano.txt":
     - узлы Точка1/Точка2 (номера, координаты, отметки, углы, размеры, блоки);
     - трасса (диаметр, тип, угол, уклон, длина);
     - футляр (блок, x, длина, тип, диаметр, описание) — из конструкции участка
       ("Конструкция - Футляры"): ветка 41 (тип) — "Тип конструкции", ветка 43
       (opisanie) — свойство "Описание" этого элемента конструкции (как у трассы);
       если описание не заполнено, ячейка остаётся пустой;
     - Razdel = введённый номер раздела.
   Дополнительно пишет лог rezult\pnsx_network_dump.txt.

Посчитать материалы (getMat)
----------------------------
Меню "PNSX" -> "Посчитать материалы (getMat)" собирает СЫРЫЕ типы Robur,
которые попадут в столбцы типов файла данные_с_плана.xls (6=t1_tip,
20=t2_tip, 34=trassa_tip, 41=futlar_tip) ДО применения файла
ассоциации типов.txt, и пишет их с подсчётом в robur\getMat.txt.
Строки берутся той же функцией, что и у выгрузки, поэтому названия и
количество совпадают с ячейками 1:1. Файл БЕЗ шапки: сразу три блока,
заголовок блока = номера столбцов xls. "СТОЛБЦЫ 6, 20 - t1_tip, t2_tip
(узлы)" (типы узлов объединены, без дублей), "СТОЛБЕЦ 34 - trassa_tip" и
"СТОЛБЕЦ 41 - futlar_tip". В блоках пишутся ТОЛЬКО наименования типов, по
одному в строке, без ":" и без количества — так список удобно целиком
копировать в robur\ассоциации типов.txt (сверху — тип из Robur, снизу —
ТипУ1 и т.п.). Порядок в блоке — по алфавиту, дубликаты объединены.
Один и тот же тип может быть и в 34, и в 41 — он выводится в обоих блоках.
Пустые ячейки не считаются и нигде не выводятся.


Пути и переносимость
--------------------
Пути больше НЕ хардкодятся в исходнике. Установщик install.cmd/install.ps1
при запуске сам определяет расположение (PSScriptRoot = папка robur, где лежит
install.cmd) и РЯДОМ с папкой robur ищет папку dano. Вычисленные абсолютные пути
записываются в src\InstallPaths.cs (автогенерируется install.ps1 перед компиляцией)
и зашиваются в PnsxDump.dll, поэтому Robur находит данные_с_плана.xls именно там:
  robur\  (где install.cmd)          -> InstallPaths.RoburDir
  <рядом>\dano\данные_с_плана.xls    -> InstallPaths.DanoDir
  robur\rezult\                      -> InstallPaths.RezultDir
Можно переносить папку "robur" вместе с соседней папкой dano в другое место —
достаточно перезапустить install.cmd (пересоберёт DLL с новыми путями).
Типы сопоставляются по robur\ассоциации типов.txt (UTF-8).

ВАЖНО: после изменения/обновления плагина нужно перезапустить Robur,
т.к. DLL загружается в процесс и не подменяется на лету.

Логи (в этой папке)
-------------------
  install_log.txt  - протокол установки
  build_log.txt    - вывод компилятора

Состав
------
  install.cmd / install.ps1 - установщик (UTF-8 BOM)
  pnsxdump.snk              - ключ строгого имени
  src\PnsxDumpModule.cs     - логика выгрузки
  src\PnsxDumpPluginHost.cs - регистрация модуля
  src\PnsxDump.plugin       - описание модуля, команды, меню
  pnsx-tool\                - служебные утилиты/копия SDK (для разработки)

Примечание
----------
Внешний триггер "программа -> файл-сигнал" не работает: Robur грузит
сторонние плагины лениво (только при вызове команды), поэтому надёжный
триггер — команда меню.


Что выгружается
---------------
  - узлы (колодцы): Id, имя, координаты X/Y, тип, описание;
  - трубы: диаметры (внешний/внутренний/номинальный), материал, длина плана
    и профиля, станции, уклон, отметки лотка и верха;
  - футляры: элементы конструкции участка ("Конструкция - Футляры"):
    "Тип конструкции", станции начала/конца, длина.

Возможные проблемы на новой версии
----------------------------------
  - Если API изменился, компиляция не пройдёт — установщик покажет ошибки
    компилятора и сохранит их в build_log.txt. Нужно будет поправить
    src\PnsxDumpModule.cs под новые имена членов.
  - Если пункт меню не появился: проверьте лог Robur
    %APPDATA%\Topomatic\<версия>\Log.log. В новой версии может иначе
    называться меню или формат .plugin.

Диагностика
-----------
  Запуск с указанием каталога вручную:
    powershell -File install.ps1 -RoburDir "C:\Program Files\..."
  Лог сборки: build_log.txt (в этой папке).
